; Step 1: Detect current network mode before making changes
var previousMode = "AP"
var previousIP = "192.168.0.1"

if network.interfaces[0].actualIP != "0.0.0.0"
  set var.previousIP = network.interfaces[0].actualIP
  if network.interfaces[0].actualIP == "192.168.1.50"
    set var.previousMode = "ETPC"
  else
    set var.previousMode = "ETH"
elif network.interfaces[1].actualIP != "0.0.0.0"
  set var.previousIP = network.interfaces[1].actualIP
  if network.interfaces[1].actualIP == "192.168.0.1"
    set var.previousMode = "AP"
  else
    set var.previousMode = "CLIENT"

M98 P"0:/sys/user/variables/APName.g"

; Step 2: Ask for SSID and password
M291 J1 R"Enter WiFi Network Name (SSID)" P"Case sensitive. Make sure to connect to a 2.4GHz network. The WiFi module will not connect to 5.0GHz networks." S7
var nn = input
M291 J1 R"Enter WiFi Network Password" P"Case sensitive. Make sure to connect to a 2.4GHz network. The WiFi module will not connect to 5.0GHz networks." S7
var pp = input

; Save credentials for reuse
echo >"0:/sys/user/actions/WiFiPass.g" "M587 S""" ^ var.nn ^ """ P""" ^ var.pp ^ """"

; Step 3: Confirm and test connection
var testMsg1 = "You will lose connection momentarily.<br>"
var testMsg2 = "Make sure WiFi is available and in range.<br>"
var testMsg3 = "🟡 YELLOW - Testing<br>🟢 GREEN - Success<br>🔴 RED - Failed"
M291 R"Testing WiFi Connection" P{var.testMsg1 ^ var.testMsg2 ^ var.testMsg3} S4 K{"Begin Test","Cancel"} F0

if input == 1
    abort "Script canceled by user"

M98 P"0:/sys/led/pause.g"

; Turn off both interfaces first
M552 I1 S-1
G4 S2
M552 I0 S0
G4 S2

; Configure WiFi client mode
M552 I1 S0
G4 S5

M588 S"*"
G4 S1

M589 S{global.APName} P"1234567890" I192.168.0.1
G4 S1

; Add new network credentials
M98 P"0:/sys/user/actions/WiFiPass.g"
G4 S1

M552 I1 S-1
G4 S2

M552 I1 S1
G4 S1

; Wait for WiFi connection (up to 30 seconds)
while (network.interfaces[1].actualIP == "0.0.0.0" || network.interfaces[1].actualIP == "192.168.0.1") && iterations < 30
  G4 S1

; Check if connection was successful
var connectionSuccess = network.interfaces[1].actualIP != "0.0.0.0" && network.interfaces[1].actualIP != "192.168.0.1"

if var.connectionSuccess
    ; Success - WiFi connected
    M98 P"0:/sys/led/end.g"
    
    ; Show success message with options
    var wifiIP = network.interfaces[1].actualIP
    var localName = global.APName ^ ".local"
    var successMsg1 = "✅ WiFi Connected Successfully!<br><br>"
    var successMsg2 = "Network: " ^ var.nn ^ "<br>"
    var successMsg3 = "IP Address: " ^ var.wifiIP ^ "<br>"
    var successMsg4 = "Local Domain: " ^ var.localName ^ "<br><br>"
    var successMsg5 = "Would you like to save this mode?"
    M291 S4 R"Connection Successful" P{var.successMsg1 ^ var.successMsg2 ^ var.successMsg3 ^ var.successMsg4 ^ var.successMsg5} K{"Save Mode","Revert to Previous","Cancel"} F0
    
    if input == 0
        ; User chose "Save Mode"
        echo >"0:/sys/user/actions/NetworkMode.g" "M552 I1 S1 ; Enable WiFi Client Mode"
        M291 S1 R"Mode Saved" P{"WiFi Client mode has been saved and will remain active after restart.<br>Network: " ^ var.nn} T0
        M98 P"0:/sys/led/resetstatus.g"
        M99
    elif input == 1
        ; User chose "Revert to Previous"
        M98 P"0:/sys/led/resetstatus.g"
        
        ; Turn off WiFi
        M552 I1 S-1
        G4 S2
        M552 I0 S0
        G4 S2
        
        ; Restore previous mode
        if var.previousMode == "ETH"
            M552 I0 S1
        elif var.previousMode == "CLIENT"
            M552 I1 S0
            G4 S5
            M552 I1 S1
        elif var.previousMode == "AP"
            M552 I1 S0
            G4 S5
            M552 I1 S2
        elif var.previousMode == "ETPC"
            M552 P192.168.1.50 I0 S1
            M553 P255.255.255.0
            M554 P192.168.1.1
        else
            M552 I1 S0
            G4 S5
            M552 I1 S2
        
        G4 S5
        
        ; Wait for previous mode to reconnect
        var waitCount = 0
        while var.waitCount < 30
            if var.previousMode == "ETH" || var.previousMode == "ETPC"
                if network.interfaces[0].actualIP != "0.0.0.0"
                    break
            else
                if network.interfaces[1].actualIP != "0.0.0.0"
                    break
            G4 S1
            set var.waitCount = var.waitCount + 1
        
        ; Get restored IP
        var restoredIP = var.previousMode == "ETH" || var.previousMode == "ETPC" ? network.interfaces[0].actualIP : network.interfaces[1].actualIP
        
        M291 S1 R"Reverted to Previous Mode" P{"Successfully restored previous mode.<br>IP Address: " ^ var.restoredIP} T0
        M99
    else
        ; User chose "Cancel" - stay in new mode but don't save
        M98 P"0:/sys/led/resetstatus.g"
        M99

; Failed - restore previous network mode
M98 P"0:/sys/led/fault.g"

; Turn off both interfaces
M552 I1 S-1
G4 S2
M552 I0 S0
G4 S2

; Restore previous mode
if var.previousMode == "ETH"
    M552 I0 S1
elif var.previousMode == "CLIENT"
    M552 I1 S0
    G4 S5
    M552 I1 S1
elif var.previousMode == "AP"
    M552 I1 S0
    G4 S5
    M552 I1 S2
elif var.previousMode == "ETPC"
    M552 P192.168.1.50 I0 S1
    M553 P255.255.255.0
    M554 P192.168.1.1
else
    M552 I1 S0
    G4 S5
    M552 I1 S2

G4 S5

; Wait for previous mode to reconnect
var waitCount = 0
while var.waitCount < 30
    if var.previousMode == "ETH" || var.previousMode == "ETPC"
        if network.interfaces[0].actualIP != "0.0.0.0"
            break
    else
        if network.interfaces[1].actualIP != "0.0.0.0"
            break
    G4 S1
    set var.waitCount = var.waitCount + 1

; Get restored IP
var restoredIP = var.previousMode == "ETH" || var.previousMode == "ETPC" ? network.interfaces[0].actualIP : network.interfaces[1].actualIP
if var.restoredIP == "0.0.0.0"
    set var.restoredIP = var.previousIP

M291 S2 R"Connection Failed" P{"❌ WiFi connection failed.<br><br>Automatically reverted to previous mode.<br>IP Address: " ^ var.restoredIP}

M98 P"0:/sys/led/resetstatus.g"